package la.iok.hzsvn.lewin.movie.shopmovie.entity;

import la.iok.hzsvn.lewin.movie.core.model.CouponBase;
import la.iok.hzsvn.share.collection.IdAble;

import java.util.Date;

/**
 * 优惠券
 */
public class Coupon extends CouponBase implements IdAble<Long> {
    /**
     * 适用所有剧本类别的id
     */
    public static final Long MOVIE_LEVEL_ALL = -1L;
    /**
     * 不限制折扣券的最大抵扣金额
     */
    public static final Integer MAX_AMOUNT_UNLIMITED = -1;
    /**
     * 创建未被领取的状态
     */
    public static final Integer STATUS_CREATED = 0;
    /**
     * 未使用状态
     */
    public static final Integer STATUS_UNUSED = 1;
    /**
     * 部分使用状态
     */
    public static final Integer STATUS_PARTIAL_USED = 2;
    /**
     * 已使用状态
     */
    public static final Integer STATUS_USED = 3;

    public static final Integer STATUS_WaitLOCK = 4;

    public static final Integer STATUS_LOCK = 5;

    private Long id;
    /**
     * 发放的店铺
     */
    private Long orgUnitId;
    /**
     * 优惠券的所有人
     */
    private Long userId;
    /**
     * 优惠券定义的id
     */
    private Long couponDefinitionId;
    /**
     * 优惠券适用的剧本类别.如果是-1，则不限制适用的剧本类别。
     */
    private Long movieLevelId;
    /**
     * 初始额度。发放的时候的初始额度
     */
    private Integer initAmount;
    /**
     * 最大抵扣金额。当是折扣券的时候,根据使用的实际金额，以百分比进行抵扣，如果计算的抵扣金额大于最大抵扣金额,则只能以最大抵扣金额进行抵扣。
     * 如果为-1，则不限制抵扣金额,就以折扣计算的金额进行抵扣
     */
    private Integer maxAmount;
    /**
     * 创建优惠券的用户id
     */
    private Long createUserId;
    /**
     * 生效时间(领取时间)
     */
    private Date start;
    /**
     * 失效时间
     */
    private Date end;
    /**
     * 使用状态：1：未使用，2：部分使用（可以多次使用的情况下），3：已使用
     */
    private Integer status;
    /**
     * 数据版本
     */
    private Long version;

    @Override
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getOrgUnitId() {
        return orgUnitId;
    }

    public void setOrgUnitId(Long orgUnitId) {
        this.orgUnitId = orgUnitId;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getCouponDefinitionId() {
        return couponDefinitionId;
    }

    public void setCouponDefinitionId(Long couponDefinitionId) {
        this.couponDefinitionId = couponDefinitionId;
    }

    public Long getMovieLevelId() {
        return movieLevelId;
    }

    public void setMovieLevelId(Long movieLevelId) {
        this.movieLevelId = movieLevelId;
    }

    public Integer getInitAmount() {
        return initAmount;
    }

    public void setInitAmount(Integer initAmount) {
        this.initAmount = initAmount;
    }

    public Integer getMaxAmount() {
        return maxAmount;
    }

    public void setMaxAmount(Integer maxAmount) {
        this.maxAmount = maxAmount;
    }

    public Long getCreateUserId() {
        return createUserId;
    }

    public void setCreateUserId(Long createUserId) {
        this.createUserId = createUserId;
    }

    public Date getStart() {
        return start;
    }

    public void setStart(Date start) {
        this.start = start;
    }

    public Date getEnd() {
        return end;
    }

    public void setEnd(Date end) {
        this.end = end;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    /**
     * 是否所有类别的剧本都适用。如果剧本类别是-1，则所有剧本类别都适用，返回true,否则返回false
     * @return 剧本类别是-1，返回true,否则返回false
     */
    public boolean applyAllLevelMovie(){
        return MOVIE_LEVEL_ALL.equals(movieLevelId);
    }

    /**
     * 判断是否不限制最大抵扣金额。调用之前需要先确定是折扣券，不然没意义
     * @return 最大抵扣金额为-1则不限制,返回true,否则false
     */
    public boolean unlimitedAmount(){
        return MAX_AMOUNT_UNLIMITED.equals(maxAmount);
    }

    /**
     * 是否已使用状态
     * @return 是已使用状态返回true,否则false
     */
    public boolean statusUsed(){
        return STATUS_USED.equals(status);
    }

    /**
     * 是否被锁定状态
     * @return 是返回true,否则false
     */
    public boolean statusLock() {return STATUS_LOCK.equals(status);}
    /**
     * 是否创建未领取状态
     * @return 是返回true,否则false
     */
    public boolean statusCreated(){
        return STATUS_CREATED.equals(status);
    }

    public boolean statusNoUsed(){
        return STATUS_UNUSED.equals(status);
    }

    public boolean statusWaitLock(){
        return STATUS_WaitLOCK.equals(status);
    }




}
